#ifndef __STRUCT_H__
#define __STRUCT_H__
#include <list.h>
#include <stdio.h>
#include<cJSON.h>
#include <shmem.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <msg_queue_peer.h>

//mb点表结构体
struct mb_node
{
    int key; //唯一键值
    char name[128]; //数据点名称
    int type;  //数据点类型
    int addr;
};

//mb链表结构体
struct mb_node_list
{
    struct mb_node node;
    struct list_head list;
};

//mo点表
struct m0_node
{
	int key;
	char name[128];
	int type;
};

//m0链表
struct m0_node_list
{
	struct m0_node node;
	struct list_head list;
};

//消息队列
struct msg_struct
{
	char msg_val[64];
	int key;
};

//val数据类型
union val_t
{
	int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};

//采集数据
struct std_node
{
	int key;  //唯一键值
	int type;  //数据点类型
	int dev_type;  //属于哪个设备：m0或modbus
	union val_t old_val;  //变化上报后需要更新旧值
	union val_t new_val;  //从共享内存取出最新数据，放到new_val中
	int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};

//保存共享内存地址
struct need
{
    struct std_node *p_equipment;
    struct std_node *p_edge;
};

//m0数据上报结构体
struct m0_env_info
{
	uint8_t head[3]; //标识位
	uint8_t type;    //数据类型
	uint8_t snum;    //房间编号
	uint8_t temp[2]; //温度
	uint8_t hum[2]; //湿度
	uint8_t x;      //三轴信息
	uint8_t y;
	uint8_t z;
	uint32_t ill;   //光照
	uint32_t bet;   //电池电量
	uint32_t adc;   //电位器信息
};

void serial_init(int fd);
float dota_atof(char unitl);
int dota_atoi(const char *cDecade);
float dota_adc(unsigned int ratio);

#endif
